/*
 * Parser.c
 *
 *  Created on: 31/08/2011
 *      Author: guido
 */

#include <string.h>
#include <stdio.h>
#include "parser.h"

/* preprocesar(..) pasa al buffer por dos funciones: primero le borra los
 * comentarios, luego procesa las directivas (si es que tiene). Ademas
 * dependiendo del valor de retorno de procesarDirectivas, si es 2, eso
 * significa que tiene que agregar un archivo nuevo */
int Parser_preprocesar(Parser* parser) {
	int hayMasLineas = ListaArch_leer(&(parser->archivos), parser->buffer, MAX_DE_LINEA);
	int resultado = 0;
	while ((hayMasLineas) && (resultado != CODIGO_ERROR)) {

		Descoment_borrarComentarios(&(parser->descomentador), parser->buffer);
		resultado = Prepro_procesarDirectivas(&(parser->preprocesador), parser->buffer);
		if (resultado == CODIGO_OK) {
			printf("%s", parser->buffer);
		}
		if (resultado == CODIGO_ARCHIVO_NUEVO) {
			resultado = ListaArch_agregarArchivo(&(parser->archivos), parser->preprocesador.ruta);
		}
		if (resultado != CODIGO_ERROR
			)
			hayMasLineas = ListaArch_leer(&(parser->archivos), parser->buffer, MAX_DE_LINEA);
	}
	return resultado;
}

int Parser_init(Parser* p, char* ruta) {
	p->buffer[0] = 0;
	Descoment_init(&(p->descomentador));
	Prepro_init(&(p->preprocesador));
	int resultado = ListaArch_init(&(p->archivos), ruta);
	return resultado;
}

